"""
使用锁解决多线程的问题

多线程和多进程的最大区别：
    1.多进程中，同一个变量，各自有一份拷贝存在于每个进程中，互不影响。
    2.多线程中，所有变量都由所有线程共享。
"""

import time
import threading

# 账户余额
balance = 100
# 线程锁
lock = threading.Lock()


def run_thread(value):
    for i in range(1000000):
        # 获取锁
        lock.acquire()
        try:
            change_balance(value)
        finally:
            # 释放锁
            lock.release()


def change_balance(value):
    global balance
    balance = balance + value
    balance = balance - value


def run():
    start_time = time.time()
    print("初始余额为：{balance}".format(balance=balance))
    t1 = threading.Thread(target=run_thread, args=(5,))
    t2 = threading.Thread(target=run_thread, args=(8,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print("最终余额为：{balance}".format(balance=balance))
    end_time = time.time()

    # 加锁，运行时间会长一些
    print("运行时间：{cost_time} 秒".format(cost_time='%.2f' % (end_time - start_time)))


if __name__ == "__main__":
    run()
